package com.dji.sdk.sample.internal.controller;
import android.app.Application;
import android.os.Build;
import android.os.Handler;
import android.os.Looper;
import android.support.v4.content.ContextCompat;
import android.util.Log;
import android.widget.Toast;
import com.dji.sdk.sample.R;
import com.squareup.otto.Bus;
import com.squareup.otto.ThreadEnforcer;
import dji.common.error.DJIError;
import dji.common.error.DJISDKError;
import dji.log.DJILog;
import dji.sdk.base.BaseComponent;
import dji.sdk.base.BaseProduct;
import dji.sdk.products.Aircraft;
import dji.sdk.products.HandHeld;
import dji.sdk.sdkmanager.BluetoothProductConnector;
import dji.sdk.sdkmanager.DJISDKManager;
/**
* Main application
*/
public class DJISampleApplication extends Application {
public static final String TAG = DJISampleApplication.class.getName();
private static BaseProduct product;
private static BluetoothProductConnector bluetoothConnector = null;
private static Bus bus = new Bus(ThreadEnforcer.ANY);
private static DJISampleApplication instance;
/**
* Gets instance of the specific product connected after the
* API KEY is successfully validated. Please make sure the
* API_KEY has been added in the Manifest
*/
public static synchronized BaseProduct getProductInstance() {
if (null == product) {
product = DJISDKManager.getInstance().getProduct();
}
return product;
}
public static synchronized BluetoothProductConnector getBluetoothProductConnector() {
if (null == bluetoothConnector) {
bluetoothConnector = DJISDKManager.getInstance().getBluetoothProductConnector();
}
return bluetoothConnector;
}
public static boolean isAircraftConnected() {
return getProductInstance() != null && getProductInstance() instanceof Aircraft;
}
public static boolean isHandHeldConnected() {
return getProductInstance() != null && getProductInstance() instanceof HandHeld;
}
public static synchronized Aircraft getAircraftInstance() {
if (!isAircraftConnected()) return null;
return (Aircraft) getProductInstance();
}
public static synchronized HandHeld getHandHeldInstance() {
if (!isHandHeldConnected()) return null;
return (HandHeld) getProductInstance();
}
@Override
public void onCreate() {
super.onCreate();
/*
* handles SDK Registration using the API_KEY
*/
int permissionCheck = ContextCompat.checkSelfPermission(this, android.Manifest.permission.READ_PHONE_STATE);
if (permissionCheck == 0 || Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
DJISDKManager.getInstance().registerApp(this, mDJISDKManagerCallback);
}
instance = this;
}
public static DJISampleApplication getInstance() {
return instance;
}
public static Bus getEventBus() {
return bus;
}
private DJISDKManager.SDKManagerCallback mDJISDKManagerCallback = new DJISDKManager.SDKManagerCallback() {
@Override
public void onRegister(DJIError error) {
if (error == DJISDKError.REGISTRATION_SUCCESS) {
DJILog.e("App registration", DJISDKError.REGISTRATION_SUCCESS.getDescription());
DJISDKManager.getInstance().startConnectionToProduct();
} else {
Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), R.string.sdk_registration_message, Toast.LENGTH_LONG)
.show();
}
});
}
Log.v(TAG, error.getDescription());
}
@Override
public void onProductChange(BaseProduct oldProduct, BaseProduct newProduct) {
Log.d(TAG, String.format("onProductChanged oldProduct:%s, newProduct:%s", oldProduct, newProduct));
product = newProduct;
if (product != null) {
product.setBaseProductListener(mDJIBaseProductListener);
}
notifyStatusChange();
}
private BaseProduct.BaseProductListener mDJIBaseProductListener = new BaseProduct.BaseProductListener() {
@Override
public void onComponentChange(BaseProduct.ComponentKey key,
BaseComponent oldComponent,
BaseComponent newComponent) {
if (newComponent != null) {
newComponent.setComponentListener(mDJIComponentListener);
}
Log.d(TAG,
String.format("onComponentChange key:%s, oldComponent:%s, newComponent:%s",
key,
oldComponent,
newComponent));
notifyStatusChange();
}
@Override
public void onConnectivityChange(boolean isConnected) {
Log.d(TAG, "onProductConnectivityChanged: " + isConnected);
notifyStatusChange();
}
};
private BaseComponent.ComponentListener mDJIComponentListener = new BaseComponent.ComponentListener() {
@Override
public void onConnectivityChange(boolean isConnected) {
Log.d(TAG, "onComponentConnectivityChanged: " + isConnected);
notifyStatusChange();
}
};
private void notifyStatusChange() {
bus.post(new ConnectivityChangeEvent());
}
};
public static class ConnectivityChangeEvent {
}
}